

package com.ylbh.modules.sys.controller;

import com.ylbh.common.pojo.sys.dto.AddSupplierBillDTO;
import com.ylbh.common.pojo.sys.dto.SupplierBillDTO;
import com.ylbh.common.pojo.sys.dto.SysUserDTO;
import com.ylbh.common.pojo.sys.vo.SupplierListVO;
import com.ylbh.common.pojo.sys.vo.SysUserVO;
import com.ylbh.common.utils.*;
import com.ylbh.common.validator.Assert;
import com.ylbh.common.validator.ValidatorUtils;
import com.ylbh.common.validator.group.UpdateGroup;
import com.ylbh.common.annotation.SysLog;
import com.ylbh.common.utils.Constant;
import com.ylbh.common.utils.PageUtils;
import com.ylbh.common.utils.R;
import com.ylbh.common.validator.Assert;
import com.ylbh.common.validator.ValidatorUtils;
import com.ylbh.common.validator.group.AddGroup;
import com.ylbh.common.validator.group.UpdateGroup;
import com.ylbh.modules.sys.entity.SysUserEntity;
import com.ylbh.modules.sys.form.PasswordForm;
import com.ylbh.modules.sys.service.SysUserRoleService;
import com.ylbh.modules.sys.service.SysUserService;
import io.swagger.annotations.ApiOperation;
import oracle.jdbc.proxy.annotation.Post;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * 系统用户
 *
 * @author Mark sunlightcs@gmail.renren
 */
@RestController
@RequestMapping("/sys/user")
public class SysUserController extends AbstractController {
	@Autowired
	private SysUserService sysUserService;
	@Autowired
	private SysUserRoleService sysUserRoleService;


	/**
	 * 所有用户列表
	 */
	@GetMapping("/list")
	@RequiresPermissions("sys:user:list")
	public R list(@RequestParam Map<String, Object> params){
		//只有超级管理员，才能查看所有管理员列表
		if(getUserId() != Constant.SUPER_ADMIN){
			params.put("createUserId", getUserId());
		}
		PageUtils page = sysUserService.queryPage(params);

		return R.ok().put("page", page);
	}

	/**
	 * 供应商列表
	 * @param pageDTO
	 * @return
	 */
	@GetMapping("/getSupplierList")
	public CommonResult getSupplierList(PageDTO pageDTO){
		PageUtils page = sysUserService.getSupplierAdministrationList(pageDTO);

		return Ref.ok(page);
	}

	/**
	 * 获取登录的用户信息
	 */
	@GetMapping("/info")
	public R info(){
		return R.ok().put("user", getUser());
	}

	/**
	 * 修改登录用户密码
	 */
	@SysLog("修改密码")
	@PostMapping("/password")
	public R password(@RequestBody PasswordForm form){
		Assert.isBlank(form.getNewPassword(), "新密码不为能空");

		//sha256加密
		String password = new Sha256Hash(form.getPassword(), getUser().getSalt()).toHex();
		//sha256加密
		String newPassword = new Sha256Hash(form.getNewPassword(), getUser().getSalt()).toHex();

		//更新密码
		boolean flag = sysUserService.updatePassword(getUserId(), password, newPassword);
		if(!flag){
			return R.error("原密码不正确");
		}

		return R.ok();
	}

	/**
	 * 用户信息
	 */
	@GetMapping("/info/{userId}")
	@RequiresPermissions("sys:user:info")
	public R info(@PathVariable("userId") Long userId){
		SysUserEntity user = sysUserService.getById(userId);

		//获取用户所属的角色列表
		List<Long> roleIdList = sysUserRoleService.queryRoleIdList(userId);
		user.setRoleIdList(roleIdList);
		SysUserVO sysUserVO = new SysUserVO();
		BeanUtils.copyProperties(user, sysUserVO);
		// 如果查看的用户角色是供应商，那么就要去查询供应商信息
		if (roleIdList.size() > 0) {
			for (int i = 0; i < roleIdList.size(); i++) {
				if (roleIdList.get(i).intValue() == 6) {
					SysUserVO userEntity = sysUserService.getUserDataById(userId);
					if (null != userEntity) {
						sysUserVO.setName(userEntity.getName());
						sysUserVO.setEnterpriseType(userEntity.getEnterpriseType());
						sysUserVO.setArtCode(userEntity.getArtCode());
						sysUserVO.setNikeName(userEntity.getNikeName());
						sysUserVO.setDirectors(userEntity.getDirectors());
						sysUserVO.setDirectorMoblie(userEntity.getDirectorMoblie());
						sysUserVO.setAddress(userEntity.getAddress());
						sysUserVO.setBankName(userEntity.getBankName());
						sysUserVO.setBankNo(userEntity.getBankNo());
						sysUserVO.setBankUsername(userEntity.getBankUsername());
						sysUserVO.setSettlement(userEntity.getSettlement());
						sysUserVO.setWxNo(userEntity.getWxNo());
						sysUserVO.setEmail(userEntity.getEmail());
						sysUserVO.setFax(userEntity.getFax());
						sysUserVO.setRemarks(userEntity.getRemarks());
						if (!StringUtils.isEmpty(userEntity.getProvince()))
							sysUserVO.setProvince(userEntity.getProvince());
						if (null != userEntity.getProvinceId())
							sysUserVO.setProvinceId(userEntity.getProvinceId());
						if (!StringUtils.isEmpty(userEntity.getCity()))
							sysUserVO.setCity(userEntity.getCity());
						if (null != userEntity.getCityId())
							sysUserVO.setCityId(userEntity.getCityId());
						if (!StringUtils.isEmpty(userEntity.getArea()))
							sysUserVO.setArea(userEntity.getArea());
						if (null != userEntity.getAreaId())
							sysUserVO.setAreaId(userEntity.getAreaId());
						if (!StringUtils.isEmpty(userEntity.getImg())) {
							String[] imgs = userEntity.getImg().split(",");
							ArrayList<String> list = new ArrayList<>();
							if (imgs.length > 0) {
								for (int j = 0; j < imgs.length; j++) {
									list.add(imgs[j]);
								}
							}
							sysUserVO.setOperatingQualifiedImgurl(list);
						}
//						Collections.addAll(sysUserVO.getOperatingQualifiedImgurl(), imgs);
					}
				}
			}
		}
		return R.ok().put("user", sysUserVO);
	}

	/**
	 * 保存用户
	 */
	@SysLog("保存用户")
	@PostMapping("/save")
	@RequiresPermissions("sys:user:add")
	public R save(@RequestBody SysUserVO user){
		ValidatorUtils.validateEntity(user, AddGroup.class);
		SysUserEntity userEntity = new SysUserEntity();
		BeanUtils.copyProperties(user, userEntity);
		userEntity.setCreateUserId(getUserId());
		sysUserService.saveUser(userEntity);
		user.setUserId(userEntity.getUserId());
		//如果是供应商，还有专属信息需要添加
		if (user.getRoleIdList().size() > 0) {
			for (int i = 0; i < user.getRoleIdList().size(); i++) {
				// 状态为6表示是供应商
				if (user.getRoleIdList().get(i).intValue() == 6) {
					sysUserService.addSupplierById(user);
				}
			}
		}
		return R.ok();
	}

	/**
	 * 修改用户
	 */
	@SysLog("修改用户")
	@PostMapping("/update")
	@RequiresPermissions("sys:user:update")
	public R update(@RequestBody SysUserDTO user){
		SysUserEntity userEntity = new SysUserEntity();
		BeanUtils.copyProperties(user, userEntity);
		ValidatorUtils.validateEntity(userEntity, UpdateGroup.class);

		userEntity.setCreateUserId(getUserId());
		sysUserService.update(userEntity);

		//如果是供应商，还有专属信息需要修改
		if (null != user.getRoleIdList() && user.getRoleIdList().size() > 0) {
			for (int i = 0; i < user.getRoleIdList().size(); i++) {
				// 状态为6表示是供应商
				if (user.getRoleIdList().get(i).intValue() == 6) {
					sysUserService.updateSupplierById(user);
				}
			}
		}

		return R.ok();
	}

	/**
	 * 删除用户
	 */
	@SysLog("删除用户")
	@PostMapping("/delete")
	@RequiresPermissions("sys:user:delete")
	public R delete(@RequestBody Long[] userIds){
		if(ArrayUtils.contains(userIds, 1L)){
			return R.error("系统管理员不能删除");
		}

		if(ArrayUtils.contains(userIds, getUserId())){
			return R.error("当前用户不能删除");
		}

		sysUserService.deleteBatch(userIds);

		return R.ok();
	}

	@ApiOperation("查询现有供应商")
	@GetMapping("querySupplierList")
	public CommonResult<List> querySupplierList() {
		List<SupplierListVO> list = sysUserService.querySupplierList();
		return Ref.ok(list);
	}

	@ApiOperation("供应商账单列表")
	@GetMapping("querySupplierBillList")
	@RequiresPermissions("sys:user:querySupplierBillList")
	public CommonResult<PageUtils> querySupplierBillList(SupplierBillDTO supplierBillDTO) {
		PageUtils list = sysUserService.querySupplierBillList(supplierBillDTO);
		return Ref.ok(list);
	}

	@ApiOperation("新增供应商账单")
	@PostMapping("addSupplierBill")
	@RequiresPermissions("sys:user:addSupplierBill")
	public CommonResult addSupplierBill(@RequestBody AddSupplierBillDTO addSupplierBillDTO) {
		sysUserService.addSupplierBill(addSupplierBillDTO);
		return Ref.ok();
	}

	@ApiOperation("删除供应商账单")
	@PostMapping("modifySupplierBillById")
	@RequiresPermissions("sys:user:modifySupplierBillById")
	public CommonResult modifySupplierBillById(@RequestBody String[] ids) {
		sysUserService.modifySupplierBillById(Arrays.asList(ids));
		return Ref.ok();
	}

//	/**
//	 * 所有用户列表
//	 */
//	@GetMapping("/list")
//	@RequiresPermissions("sys:user:list")
//	public R list(@RequestParam Map<String, Object> params){
//		//只有超级管理员，才能查看所有管理员列表
//		if(getUserId() != Constant.SUPER_ADMIN){
//			params.put("createUserId", getUserId());
//		}
//		PageUtils page = sysUserService.queryPage(params);
//
//		return R.ok().put("page", page);
//	}
//
//	/**
//	 * 获取登录的用户信息
//	 */
//	@GetMapping("/info")
//	public R info(){
//		return R.ok().put("user", getUser());
//	}
//
//	/**
//	 * 修改登录用户密码
//	 */
//	@SysLog("修改密码")
//	@PostMapping("/password")
//	public R password(@RequestBody PasswordForm form){
//		Assert.isBlank(form.getNewPassword(), "新密码不为能空");
//
//		//sha256加密
//		String password = new Sha256Hash(form.getPassword(), getUser().getSalt()).toHex();
//		//sha256加密
//		String newPassword = new Sha256Hash(form.getNewPassword(), getUser().getSalt()).toHex();
//
//		//更新密码
//		boolean flag = sysUserService.updatePassword(getUserId(), password, newPassword);
//		if(!flag){
//			return R.error("原密码不正确");
//		}
//
//		return R.ok();
//	}
//
//	/**
//	 * 用户信息
//	 */
//	@GetMapping("/info/{userId}")
//	@RequiresPermissions("sys:user:info")
//	public R info(@PathVariable("userId") Long userId){
//		SysUserEntity user = sysUserService.getById(userId);
//
//		//获取用户所属的角色列表
//		List<Long> roleIdList = sysUserRoleService.queryRoleIdList(userId);
//		user.setRoleIdList(roleIdList);
//
//		return R.ok().put("user", user);
//	}
//
//	/**
//	 * 保存用户
//	 */
//	@SysLog("保存用户")
//	@PostMapping("/save")
//	@RequiresPermissions("sys:user:add")
//	public R save(@RequestBody SysUserEntity user){
//		ValidatorUtils.validateEntity(user, AddGroup.class);
//
//		user.setCreateUserId(getUserId());
//		sysUserService.saveUser(user);
//
//		return R.ok();
//	}
//
//	/**
//	 * 修改用户
//	 */
//	@SysLog("修改用户")
//	@PostMapping("/update")
//	@RequiresPermissions("sys:user:update")
//	public R update(@RequestBody SysUserEntity user){
//		ValidatorUtils.validateEntity(user, UpdateGroup.class);
//
//		user.setCreateUserId(getUserId());
//		sysUserService.update(user);
//
//		return R.ok();
//	}
//
//	/**
//	 * 删除用户
//	 */
//	@SysLog("删除用户")
//	@PostMapping("/delete")
//	@RequiresPermissions("sys:user:delete")
//	public R delete(@RequestBody Long[] userIds){
//		if(ArrayUtils.contains(userIds, 1L)){
//			return R.error("系统管理员不能删除");
//		}
//
//		if(ArrayUtils.contains(userIds, getUserId())){
//			return R.error("当前用户不能删除");
//		}
//
//		sysUserService.deleteBatch(userIds);
//
//		return R.ok();
//	}
}
